x86: Allow guests to allocate up to 2MB (superpage) memory extents.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 16 Jun 2009 13:04:15 +0000 (14:04 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 16 Jun 2009 13:04:15 +0000 (14:04 +0100)
Signed-off-by: Keir Fraser <keir.fraser@eu.citrix.com>
xen/common/memory.c
xen/include/asm-ia64/iocap.h
xen/include/asm-x86/iocap.h
xen/include/xen/iocap.h

index 0dd2b9282feeeb7ff369b93ea53f233e5800e3f8..9717dc2be87ab05edcb25a71525512373f5ac157 100644 (file)
@@ -50,8 +50,7 @@ static void increase_reservation(struct memop_args *a)
                                      a->nr_extents-1) )
         return;
 
-    if ( (a->extent_order != 0) &&
-         !multipage_allocation_permitted(current->domain) )
+    if ( !multipage_allocation_permitted(current->domain, a->extent_order) )
         return;
 
     for ( i = a->nr_done; i < a->nr_extents; i++ )
@@ -96,8 +95,7 @@ static void populate_physmap(struct memop_args *a)
                                      a->nr_extents-1) )
         return;
 
-    if ( (a->extent_order != 0) &&
-         !multipage_allocation_permitted(current->domain) )
+    if ( !multipage_allocation_permitted(current->domain, a->extent_order) )
         return;
 
     for ( i = a->nr_done; i < a->nr_extents; i++ )
@@ -247,8 +245,10 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg)
     }
 
     /* Only privileged guests can allocate multi-page contiguous extents. */
-    if ( ((exch.in.extent_order != 0) || (exch.out.extent_order != 0)) &&
-         !multipage_allocation_permitted(current->domain) )
+    if ( !multipage_allocation_permitted(current->domain,
+                                         exch.in.extent_order) ||
+         !multipage_allocation_permitted(current->domain,
+                                         exch.out.extent_order) )
     {
         rc = -EPERM;
         goto fail_early;
index 4f140b847684cb8d7f0912690b4f9b828719f862..ae7a871e0c99fd72c22b881480d981d7509c067a 100644 (file)
@@ -15,4 +15,9 @@ extern int ioports_deny_access(struct domain *d,
 #define ioports_access_permitted(d, s, e)               \
     rangeset_contains_range((d)->arch.ioport_caps, s, e)
 
+#define multipage_allocation_permitted(d, order)        \
+    (((order) == 0) ||                                  \
+     !rangeset_is_empty((d)->iomem_caps) ||             \
+     !rangeset_is_empty((d)->arch.ioport_caps))
+
 #endif /* __IA64_IOCAP_H__ */
index eee47228d4a583faabf24751e498b352020ed0cd..591ae1736875614717aee4c81528f0bc0ae3c63e 100644 (file)
@@ -18,4 +18,9 @@
     (!rangeset_is_empty((d)->iomem_caps) ||             \
      !rangeset_is_empty((d)->arch.ioport_caps))
 
+#define multipage_allocation_permitted(d, order)        \
+    (((order) <= 9) || /* allow 2MB superpages */       \
+     !rangeset_is_empty((d)->iomem_caps) ||             \
+     !rangeset_is_empty((d)->arch.ioport_caps))
+
 #endif /* __X86_IOCAP_H__ */
index c32604d9c9800c6f1c5bef013907958322cee774..63bb49f140d8d129883cf5b4a8c3735cc31c7b2c 100644 (file)
@@ -28,8 +28,4 @@
 #define irq_access_permitted(d, i)                      \
     rangeset_contains_singleton((d)->irq_caps, i)
 
-#define multipage_allocation_permitted(d)               \
-    (!rangeset_is_empty((d)->iomem_caps) ||             \
-     !rangeset_is_empty((d)->arch.ioport_caps))
-
 #endif /* __XEN_IOCAP_H__ */